package DAO;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import Pojo.Professor;
import Pojo.Turma;

/** Classe de implementação do ProfessorDao. 
* 
* @author Thiago de Sousa Silveira.
* 
* */
public class ProfessorDaoImplArquivo implements ProfessorDao{
	
	private List<Professor> listaProfessores;
	private static final String nomeArquivo = "Arquivos/Professores.txt";
	private int proximoId;
	
	/**Método Construtor sem identificador.
	 * 
	 */
	public ProfessorDaoImplArquivo(){
		this.listaProfessores= new ArrayList<Professor>();
		this.proximoId=0;
		this.buscarArmazenamento();
	}
	
	/**Método Construtor com identificador.
	 * 
	 * @param identificador
	 */
	public ProfessorDaoImplArquivo(int identificador){
		this.listaProfessores= new ArrayList<Professor>();
		this.proximoId=0;
	}
	
	/**Getter de próximo Id disponível.
	 * 
	 * @return int com o próximo id disponível.
	 */
	public int getProximoId(){
		return(this.proximoId);
	}
	
	/**Getter de Lista de Professores
	 * 
	 * @return List<Professor> com a lista de professores.
	 */
	public List<Professor> getListaProfessores(){
		return(this.listaProfessores);
	}
	
	/**Busca de turmas por id de professor
	 * 
	 * @param idProfessor
	 * @return List<Turma> com as turmas encontradas.
	 */
	private List<Turma> buscarTurmas(int idProfessor){
		TurmaDaoImplArquivo turmaDaoImplArquivo = new TurmaDaoImplArquivo(idProfessor);
		return(turmaDaoImplArquivo.buscarArmazenamentoProcurarPorProfessor(idProfessor));
	}
	
	/**Busca de dados de professores do arquivo.
	 * 
	 */
	private void buscarArmazenamento(){
		try{
			this.listaProfessores= new ArrayList<Professor>();
			FileReader arq = new FileReader(nomeArquivo);		//Cria objeto arquivo
		    BufferedReader lerArq = new BufferedReader(arq);	//Cria objeto de leitura
		    String linha=lerArq.readLine();
		    Professor professor;
		    String dados[];
		    
		    while (linha != null) {
		    	dados = linha.split("\t");
		    	List<Turma> listaTurmasAux = buscarTurmas(Integer.parseInt(dados[0]));
		    	professor = new Professor(Integer.parseInt(dados[0]),dados[1],dados[2],dados[3],listaTurmasAux);
		    	this.listaProfessores.add(professor);
		    	linha = lerArq.readLine();						//Lê as linhas.
		    	this.proximoId++;
		    }
		    this.proximoId++;
		    
		    arq.close();										//Fechando o arquivo
		}catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
	}
	
	/**Busca de professor no arquivo.
	 * 
	 * @param idProfessor
	 * @return Professor encontrado na busca.
	 */
	public Professor buscarArmazenamentoProcurarPorId(int idProfessor){
		try{
			FileReader arq = new FileReader(nomeArquivo);		//Cria objeto arquivo
		    BufferedReader lerArq = new BufferedReader(arq);	//Cria objeto de leitura
		    String linha=lerArq.readLine();
		    String dados[];
		    Professor professor;
		    
		    while (linha != null) {
		    	dados = linha.split("\t");
		    	if (Integer.parseInt(dados[0])==idProfessor){
		    		professor = new Professor(Integer.parseInt(dados[0]),dados[1],dados[2],dados[3]);
		    		return(professor);
		    	}
		    	linha = lerArq.readLine();						//Lê as linhas.
		    }
		    
		    arq.close();										//Fechando o arquivo
		}catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
		return(null);
	}
	
	/**Método para armazenamento de dados no arquivo.
	 * 
	 */
	private void salvarArmazenamento(){
		try {
			BufferedWriter out = new BufferedWriter(new FileWriter(nomeArquivo));
			Iterator i = listaProfessores.iterator();
			
			Professor professor;
			while(i.hasNext()){
				professor = (Professor) i.next();
				out.write(professor.toString());
			}
			
			out.close();
		} catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
	}
	
	/**Método para inserção de professor na lista.
	 * @param professor
	 * @return boolean com a validação da inserção.
	 */
	public boolean adicionarProfessor(Professor professor){
		Iterator i = listaProfessores.iterator();
		Professor professorComparacao;
		while(i.hasNext()){
			professorComparacao = (Professor) i.next();
			if (professorComparacao.getIdProfessor() == professor.getIdProfessor()){
				return(false);
			}
		}
		this.listaProfessores.add(professor);
		this.proximoId++;
		this.salvarArmazenamento();
		return(true);
	}
	
	/**Método para remoção de professor na lista
	 * @param professor
	 * @return boolean com a validação da remoção do professor.
	 */
	public boolean removerProfessor(Professor professor){
		Iterator i = listaProfessores.iterator();
		Professor professorComparacao;
		boolean resultado;
		while(i.hasNext()){
			professorComparacao = (Professor) i.next();
			if (professorComparacao.getIdProfessor() == professor.getIdProfessor()){
				resultado = this.listaProfessores.remove(professorComparacao);
				this.salvarArmazenamento();
				return(resultado);
			}
		}
		return(false);
	}
	
	/**Busca de professor por CPF
	 * @param cpf
	 * @return Professor encontrado na busca.
	 */
	public Professor procurarPorCpf(String cpf){
		Iterator i = listaProfessores.iterator();
		Professor professor;
		while(i.hasNext()){
			professor = (Professor) i.next();
			if (professor.getCpf().equals(cpf)){
				return(professor);
			}
		}
		return(null);
	}
	
	/** Busca de professor pelo nome
	 *  @param nome
	 *  @return List<Professor> com os professores encontrados.
	 */
	public List<Professor> procurarPorNome(String nome){
		List<Professor> listaProfessorNome = new ArrayList<Professor>();
		
		Iterator i = listaProfessores.iterator();
		Professor aluno;
		while(i.hasNext()){
			aluno = (Professor) i.next();
			if (aluno.getNome().equals(nome)){
				listaProfessorNome.add(aluno);
			}
		}
		
		return(listaProfessorNome);
	}
	
	/**Busca de professores de um determinado departamento.
	 * 
	 * @param departamento
	 * @return
	 */
	public List<Professor> procurarPorDepartamento(String departamento){
		List<Professor> listaProfessorDepartamento = new ArrayList<Professor>();
		
		Iterator i = listaProfessores.iterator();
		Professor professor;
		while(i.hasNext()){
			professor = (Professor) i.next();
			if (professor.getDepartamento().equals(departamento)){
				listaProfessorDepartamento.add(professor);
			}
		}
		
		return(listaProfessorDepartamento);
	}
	
	/**Busca de professor pelo idProfessor.
	 * 
	 * @param idProfessor
	 * @return Professor encontrado na busca.
	 */
	public Professor procurarPorId(int idProfessor){
		Iterator i = listaProfessores.iterator();
		Professor professor;
		while(i.hasNext()){
			professor = (Professor) i.next();
			if (professor.getIdProfessor() == idProfessor){
				return(professor);
			}
		}
		return(null);
	}

}
